<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>
    
    // 计算n阶乘

    // 5: 5*4*3*2*1

    // 递的过程，将计算结果归出去
    // n: n * (n-1) * ((n-1)-1) * (((n-1)-1)-1) * .... * 1

    // 递的终点，归的起点
    // 1: 1

    // 5!：5 * 4 * 3 * 2 * 1
    //     5 * 4!
    //         4 * 3!
    //             3 * 2!
    //                 2 * 1!
    //                     1

    // 假设有一个函数叫fn，专门用来计算阶乘
    // fn(5) = 5 * fn(4)
    //             4 * fn(3)
    //                 3 * fn(2)
    //                     2 * fn(1)
    //                         1

    // fn(n) = n * fn(n-1);

    // fn(1) = 1

    // function fn(n){
    //     if(n===1){
    //         return 1;
    //     }else{
    //         return n * fn(n-1);
    //     }
    // }
    // console.log(fn(5));

    // 第一遍：
    // n = 5
    // 判断n === 1 ? 否
    // 准备返回：5 * 又开启一次新的执行(4)

    // 第二遍：
    // n = 4
    // 判断n === 1 ? 否
    // 准备返回：4 * 又开启一次新的执行(3)

    // 第三遍：
    // n = 3
    // 判断n === 1 ? 否
    // 准备返回：3 * 又开启一次新的执行(2)
    
    // 第四遍：
    // n = 2
    // 判断n === 1 ? 否
    // 准备返回：2 * 又开启一次新的执行(1)
    
    // 第五遍：
    // n = 1
    // 判断n === 1 ? 是
    // 准备返回：1
    // 递结束了，准备开始归


    // =============


    // 斐波那契数列：
    // 1，1，2，3，5，8，13，21，34，55...
    // 规律：从第三位开始，每位都是前两位之和

    // 假设有一个函数叫fn，专门用来计算指定位数的斐波那契数

    // 举例
    // fn(5) = fn(4) + fn(3)
    // fn(4) = fn(3) + fn(2)
    // fn(3) = fn(2) + fn(1)
    // fn(2) = 1
    // fn(1) = 1

    // 公式
    // fn(n) = fn(n-1) + fn(n-2)

    // fn(2) = 1
    // fn(1) = 1

    // function fn(n){
    //     if(n === 1 || n === 2){
    //         return 1;
    //     }else{
    //         return fn(n-1) + fn(n-2);
    //     }
    // }
    // console.log(fn(10));


    // =============


    // 计算两个数字的最大公约数
    // 约数：可以被整除的除数
    // 公约数：可以被两个数字整除的除数
    // 最大公约数：可以被两个数字整除的最大除数

    // 使用辗转相除法计算最大公约数：
    // 将这两个数字取余，如果余数是0，小的那个数字，就是最大公约数
    // 如果余数不为0，将小的数字和余数继续取余，直到余数为0，本次小的那个数字，就是最大公约数

    // 16 % 12 === 4
    // 12 % 4 === 0

    // 81 % 18 === 9
    // 18 % 9 === 0

    // fn(m, n) = m % n === 0 ? n : fn(n, m % n)

    // function fn(m, n){
    //     // 约束m是大的数，n是小的数
    //     if(m < n){
    //         var x = m;
    //         m = n;
    //         n = x;
    //     }
    //     var r = m % n;
    //     if(r === 0){
    //         return n;
    //     }else{
    //         return fn(n, r);
    //     }
    // }
    // console.log(fn( 12, 16 ))
    // console.log(fn( 16, 12 ))
    // console.log(fn( 81, 18 ))
    // console.log(fn( 12, 72 ))

    








</script>
</html>